package com.zyx.jdbcdemo.utils;


import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

import static org.apache.commons.beanutils.BeanUtils.copyProperties;

/**
 * @author Yaxi.Zhang
 * @since 2021/4/29 12:15
 * desc: 处理对象相关的方法类
 */
public class CommonUtil {
    /**
     * 获取对象的属性名称列表
     * @param cl 传入的对象
     * @return 对象的属性名称列表
     */
    public static List<String> getClassFiledName(Object cl) {
        Field[] fields = cl.getClass().getDeclaredFields();
        List<String> fieldNames = new ArrayList<>();
        for (Field field : fields) {
            fieldNames.add(field.getName());
        }
        return fieldNames;
    }

    /**
     * 依据属性名称获取属性值
     * @param fieldName 对象的属性名
     * @param cl 传入的对象
     * @return 对象属性名对应的属性值
     */
    public static Object getClassFieldValueByName(String fieldName, Object cl) {
        try {
            String firstLetter = fieldName.substring(0, 1).toUpperCase();
            String getter = "get" + firstLetter + fieldName.substring(1);
            Method method = cl.getClass().getMethod(getter);
            return method.invoke(cl);
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 将列表中对象的值copy到另一种类型的元素的对象中
     * @param originList 原类型数据的列表
     * @param vClass 新元素的类型
     * @param <K> 原有数据类型的泛型
     * @param <V> 新数据类型的泛型
     * @return 新类型数据的列表
     */
    public static <K, V> List<V> copyValues(List<K> originList, Class<V> vClass) {
        List<V> resList = new ArrayList<>();
        for (K key : originList) {
            V value = null;
            try {
                value = vClass.newInstance();
            } catch (Exception e) {
                e.printStackTrace();
            }
            try {
                if (value != null) {
                    copyProperties(key, value);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            resList.add(value);
        }
        return resList;
    }

    /**
     * 将对象列表转为二维Object数组
     *
     * @param list 对象列表
     * @param <T>  对象的泛型
     * @return 转换后的二维Object数组
     */
    public static <T> Object[][] list2DimObjArray(List<T> list) {
        int listSize = list.size();
        Object[][] objs = new Object[listSize][];
        for (int listIndex = 0; listIndex < listSize; listIndex++) {
            T tObj = list.get(listIndex);
            Field[] fields = tObj.getClass().getDeclaredFields();
            int fieldsLength = fields.length;
            Object[] tValues = new Object[fieldsLength];
            for (int fieldIndex = 0; fieldIndex < fieldsLength; fieldIndex++) {
                Field field = fields[fieldIndex];
                field.setAccessible(true);
                try {
                    tValues[fieldIndex] = field.get(tObj);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            objs[listIndex] = tValues;
        }
        return objs;
    }

}